package controllers

import (
	"cmt1-admin/utils"
	"log"

	"github.com/gin-gonic/gin"
	"github.com/globalsign/mgo/bson"
)

type KV struct {
	Key   int64 `bson:"key" json:"key"`     // 键
	Value int64 `bson:"value" json:"value"` // 值
}

type AcitvPack struct {
	Id        int64  `bson:"_id" json:"_id"`             // id
	Goods     []KV   `bson:"goods" json:"goods"`         // 兑换道具
	PeopleNum int64  `bson:"peopleNum" json:"peopleNum"` // 兑换人数
	CloseTime int64  `bson:"closeTime" json:"closeTime"` // 截止日期
	CodeNum   int64  `bson:"codeNum" json:"codeNum"`     // 生成兑换码的数量
	Desc      string `bson:"desc" json:"desc"`           // 描述
}

// 礼包查询条件
type AcitvPackQuery struct {
	BaseRequest
	Id        string `form:"_id"`
	CloseTime int64  `form:"closeTime"`
}

// 设置单个数据
func SetAcitvPack(c *gin.Context) {
	var ap AcitvPack
	if err := c.ShouldBindJSON(&ap); err != nil {
		handleErr(c, 404, err.Error())
		return
	}

	var apT AcitvPack
	err := GameDB.FindOne("AcitvPack", bson.M{"_id": ap.Id}, nil, &apT)
	if err != nil {
		log.Println("查询数据失败", err)
		handleErr(c, 404, err.Error())
		return
	}

	err = GameDB.Update("AcitvPack", bson.M{"_id": ap.Id}, ap)
	if err != nil {
		log.Println("更新数据失败", err)
		handleErr(c, 404, err.Error())
		return
	}

	handleOk(c, map[string]interface{}{"users": "爱白菜的小昆虫"})
}

// 获取所有数据
func GetAcitvPack(c *gin.Context) {
	var q AcitvPackQuery
	if err := c.ShouldBindQuery(&q); err != nil {
		handleErr(c, 404, err.Error())
		return
	}
	mquery := make(map[string]interface{}, 0)

	count, err := GameDB.Count("AcitvPack", mquery)
	if err != nil {
		log.Println("统计数据失败", err)
		handleErr(c, 404, err.Error())
		return
	}

	logList := make([]interface{}, 0)
	err = GameDB.FindPageSort("AcitvPack", q.Page-1, q.PageNum, mquery, nil, nil, &logList)
	if err != nil {
		log.Println("查询数据失败", err)
		handleErr(c, 404, err.Error())
		return
	}
	handleOk(c, map[string]interface{}{"logList": logList, "count": count})
}

// 更新数据
func UpdateAcitvPack(c *gin.Context) {
	var ap AcitvPack
	if err := c.ShouldBindJSON(&ap); err != nil {
		handleErr(c, 404, err.Error())
		return
	}

	var apT AcitvPack
	err := GameDB.FindOne("AcitvPack", bson.M{"_id": ap.Id}, nil, &apT)
	if err != nil {
		log.Println("查询数据失败", err)
		handleErr(c, 404, err.Error())
		return
	}

	err = GameDB.Update("AcitvPack", bson.M{"_id": ap.Id}, ap)
	if err != nil {
		log.Println("更新数据失败", err)
		handleErr(c, 404, err.Error())
		return
	}

	handleOk(c, "更新成功")
}

// 删除数据
func DeleteAcitvPack(c *gin.Context) {
	var ap AcitvPack
	if err := c.ShouldBindJSON(&ap); err != nil {
		handleErr(c, 404, err.Error())
		return
	}

	if err := DelExCodes(ap.Id); err != nil {
		log.Println("删除兑换码失败", err)
		handleErr(c, 404, err.Error())
		return
	}

	err := GameDB.Remove("AcitvPack", bson.M{"_id": ap.Id})
	if err != nil {
		log.Println("删除数据失败", err)
		handleErr(c, 404, err.Error())
		return
	}

	handleOk(c, "删除成功")
}

// 添加数据
func AddAcitvPack(c *gin.Context) {
	var ap AcitvPack
	if err := c.ShouldBindJSON(&ap); err != nil {
		handleErr(c, 404, err.Error())
		return
	}

	// 生成兑换码
	ecLst := make([]string, 0)
	for i := int64(0); i < ap.CodeNum; i++ {
		ec := utils.ExchangeCode(10)
		ecLst = append(ecLst, ec)
	}

	cType := CodeType.Once
	if ap.PeopleNum == 0 {
		cType = CodeType.Many
	}

	// 给活动礼包添加兑换码
	AddExCodes(ecLst, ap.Id, cType)

	err := GameDB.Insert("AcitvPack", ap)
	if err != nil {
		log.Println("添加数据失败", err)
		handleErr(c, 404, err.Error())
		return
	}

	handleOk(c, "添加成功")
}
